﻿using System;
using System.Collections.Generic;
using System.Linq;
using web_uchet.Models;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using System.ComponentModel.DataAnnotations;
namespace web_uchet.ViewModels
{
    [System.Web.Mvc.Bind(Exclude = "ИД_Детали")]
    public class ViewДеталь_Заказа
    {
        public ViewДеталь_Заказа()
        {
            this._Деталь_Заказа = new Деталь_Заказа();
            this._Деталь_Заказа.УслугаReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Услуги_Компаний", "ИД_Услуги", 0);
            this._Деталь_Заказа.ЗаказReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Заказы", "ИД_Заказа", 0);
            this._Деталь_Заказа.ВалютаReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Валюты", "ИД_Валюты", 0);
            
        }
        public ViewДеталь_Заказа(Деталь_Заказа Деталь_Заказа)
        {
            this._Деталь_Заказа = Деталь_Заказа;
        }
        private Деталь_Заказа _Деталь_Заказа;
        public Деталь_Заказа Деталь_Заказа
        {

            get { return this._Деталь_Заказа; }
        }
        [ScaffoldColumn(false)]
        public Int64 ИД_Детали
        {
            get { return this._Деталь_Заказа.ИД_Детали; }
        }
        [ScaffoldColumn(false)]
        public Int64 ИД_Заказа_Детали
        {
            get { return Convert.ToInt64(this._Деталь_Заказа.ЗаказReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Заказа").Value); }
            set { this._Деталь_Заказа.ЗаказReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Заказы", "ИД_Заказа", value); }
        }
        [Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RangeValidator(0, RangeBoundaryType.Inclusive, float.MaxValue, RangeBoundaryType.Inclusive,
            MessageTemplate = web_uchet.StringResources.ValidationStringResources.Range0MaxValidationMessage)]
        public float Цена_Услуги
        {
            get { return this._Деталь_Заказа.Цена; }
            set { this._Деталь_Заказа.Цена = value; }
        }
        [StringLengthValidator(50,MessageTemplate=web_uchet.StringResources.ValidationStringResources.StringLength50ValidationMessage)]
        public string Описание_Услуги
        {
            get 
            {
                if (this.Деталь_Заказа.Описание != null)
                    return this._Деталь_Заказа.Описание;
                else
                    return String.Empty;
            }
            set { this._Деталь_Заказа.Описание = value; }
        }
        public int ИД_Услуги
        {
            get
            {
                return
                    (int)this._Деталь_Заказа.УслугаReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Услуги").Value;
            }
            set
            {

                this._Деталь_Заказа.УслугаReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Услуги_Компаний", "ИД_Услуги", value);
            }
        }
        public int ИД_Валюты_Услуги
        {
            get { return (int)this._Деталь_Заказа.ВалютаReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Валюты").Value; }
            set { this._Деталь_Заказа.ВалютаReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Валюты", "ИД_Валюты", value); }
        }

        public Валюта Валюта_Услуги
        {
            get { return this._Деталь_Заказа.Валюта; }
            set { this._Деталь_Заказа.Валюта = value; }
        }
        public Услуга_Компании Услуга_Компании
        {
            get { return this._Деталь_Заказа.Услуга; }
            set { this._Деталь_Заказа.Услуга = value; }
        }
        public float Колличество_Услуги
        {
            get { return this._Деталь_Заказа.Колличество; }
            set { this._Деталь_Заказа.Колличество = value; }
        }
    }

    public class ViewДеталь_ЗаказаOperationProvider
    {
        private ModelWebUchetCon _Context;
        private web_uchet.Security.ProgramContext _SecurityContext;

        public ViewДеталь_ЗаказаOperationProvider(web_uchet.Security.ProgramContext SecurityContext)
        {
            this._Context = new ModelWebUchetCon(ModelWebUchetCon.SingleToneConnection);
            this._SecurityContext = SecurityContext;
        }
        public ViewДеталь_ЗаказаOperationProvider(ModelWebUchetCon Context, web_uchet.Security.ProgramContext SecurityContext)
        {
            this._Context = Context;
            this._SecurityContext = SecurityContext;
        }

        //v CompanyID - ID компании для которой делаем LIST
        public IEnumerable<ViewДеталь_Заказа> List(Int64 ИД_Заказа,bool IncludeDetails)
        {
            if (IncludeDetails)
            {
                var ДеталиЗаказа = this._Context.Детали_Заказов.
                    Include("Услуга").
                    Include("Валюта").
                    Where(e => e.Заказ.Компания.ИД_Компании == this._SecurityContext.CompanyID &&
                    e.Заказ.ИД_Заказа == ИД_Заказа)
                    .ToList();
                return ДеталиЗаказа.Select(e => new ViewДеталь_Заказа(e));
            }
            else
            {
                var ДеталиЗаказа = this._Context.Детали_Заказов.
                    Where(e => e.Заказ.Компания.ИД_Компании == this._SecurityContext.CompanyID &&
                    e.Заказ.ИД_Заказа == ИД_Заказа)
                    .ToList();
                return ДеталиЗаказа.Select(e => new ViewДеталь_Заказа(e));
            }
        }
        public IQueryable<Деталь_Заказа> IQueryableДетали_Заказа(Int64 ИД_Заказа)
        {
            return this._Context.Детали_Заказов.Where(e => e.Заказ.Компания.ИД_Компании == this._SecurityContext.CompanyID &&
                e.Заказ.ИД_Заказа == ИД_Заказа);
        }
        public ViewДеталь_Заказа Details(Int64 Деталь_ЗаказаID)
        {
            try
            {
                ViewДеталь_Заказа NeededDetail =
                    new ViewДеталь_Заказа(this._Context.Детали_Заказов.First(e => e.ИД_Детали == Деталь_ЗаказаID &&
                        e.Заказ.Компания.ИД_Компании == this._SecurityContext.CompanyID));

                return NeededDetail;
            }
            catch (Exception)
            {
                throw new System.Security.SecurityException("Попытка нарушения безопасности");
            }
        }
        //Delete Услуга
        public void Delete(Int64 Деталь_ЗаказаID)
        {
            Деталь_Заказа ObjectToDelete = this.Details(Деталь_ЗаказаID).Деталь_Заказа;
            this._Context.DeleteObject(ObjectToDelete);
            this.SaveChanges();
        }
        /// <summary>
        /// Проверить как будет с ИД заказа вопрос решаться
        /// </summary>
        /// <param name="NewViewДеталь_Заказа"></param>
        /// <param name="SecurirtyData"></param>
        public void Create(ViewДеталь_Заказа NewViewДеталь_Заказа)
        {
            try
            {
                this._Context.Заказы.First(e => e.ИД_Заказа == NewViewДеталь_Заказа.ИД_Заказа_Детали);
                this._Context.AddToДетали_Заказов(NewViewДеталь_Заказа.Деталь_Заказа);
                this.SaveChanges();
            }
            catch (Exception)
            {
                throw new System.Security.SecurityException("Попытка нарушения безопасности");
            }
        }
        public void Update(ViewДеталь_Заказа oldD, ViewДеталь_Заказа newD)
        {
            oldD.ИД_Валюты_Услуги = newD.ИД_Валюты_Услуги;
            oldD.ИД_Услуги = newD.ИД_Услуги;
            oldD.Колличество_Услуги = newD.Колличество_Услуги;
            oldD.Описание_Услуги = newD.Описание_Услуги;
            oldD.Цена_Услуги = newD.Цена_Услуги;
            this.SaveChanges();
        }

        public void SaveChanges()
        {
            this._Context.SaveChanges(true);
        }
    }
}